import hmac
import hashlib
import base64
import struct
import time

def get_dynamic_code(key: str, system_time: int = None, interval: int = 30000) -> str:
    """
    根据密钥和时间生成动态验证码
    :param key: Base32 编码的密钥
    :param system_time: 系统时间（毫秒级时间戳），默认为当前时间
    :param interval: 时间间隔，默认为 30 秒（30000 毫秒）
    :return: 6 位动态验证码
    """
    if system_time is None:
        system_time = int(time.time() * 1000)

    try:
        # 将 Base32 编码的密钥解码为字节
        secret = base64.b32decode(key, casefold=True)
        # 计算消息值
        msg = system_time // interval
        message = struct.pack(">Q", msg)

        # 使用 HMAC-SHA1 算法计算数据摘要
        hmac_digest = hmac.new(secret, message, hashlib.sha1).digest()

        # 获取动态验证码索引
        offset = hmac_digest[19] & 0x0f

        # 取连续 4 字节转换为整数
        truncated_hash = hmac_digest[offset:offset + 4]
        code = struct.unpack(">I", truncated_hash)[0] & 0x7fffffff

        # 取模运算并格式化为 6 位字符串
        return str(code % 1000000).zfill(6)

    except Exception as e:
        print(f"Error: {e}")
        return None


if __name__ == "__main__":
    # 示例密钥（Base32 编码格式）
    secret_key = "ZJKNS6WPIIBKVZ3X"

    # 获取动态验证码
    dynamic_code = get_dynamic_code(secret_key)
    print(f"Dynamic Code: {dynamic_code}")
